<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<script>
    /*
        随机数
            - 简单来说 Math.random() 这个函数内部会生成一个机制,然后接下来的随机数都是按照这个规则产生的,如果被破解,随机数是可以预测的
            -  crypto.getRandomValues() 这个函数真随机
     */


    // 简单的使用下, 生成 5个8位(0-2^8)数组(数组的长度为2)
    const array = new Uint8Array(2)
    for (let i = 0; i < 5; i++) {
        console.log(crypto.getRandomValues(array))
    }

    // 举例: 实现Math.random()
    function randomFloat() {
        // 生成32位随机数值
        const fooArray = new Uint32Array(1)
        // 最大值是2^32 -1
        const maxUnit32 = 0xFFFFFFFF
        // 用最大可能的值来除
        return crypto.getRandomValues(fooArray)[0] / maxUnit32
    }

    console.log(randomFloat())

    // 再测试一下,8位的,产生的随机数为 [0,2**8) 也就是0到255,包含边界
    function randomMath() {
        const uint8 = new Uint8Array(100)
        const max = 2 ** 8
        for (const randomValue of crypto.getRandomValues(uint8)) {
            if (randomValue <= 0) {
                console.log('0')
            } else if (randomValue >= 2 ** 8) {
                console.log('256')
            }
        }
    }

    randomMath()

</script>
</body>
</html>